'use strict'

// 切换到文件所在目录
process.chdir(__dirname)

const titbit = require('titbit')
const fs = require('fs')
const dbcfg = require('./dbconfig.js')
const pg = require('pg')
const wxkey = require('./wxkey.js')
const {httpcli} = require('gohttp')
const token = require('titbit-token')

try{
    fs.accessSync('./images')
}catch(err){
    fs.mkdirSync('./images')
}

let psql = new pg.Pool(dbcfg);
let cert_path = '/usr/local/share' 

const app = new titbit({
    // 开启调试模式，若错误会输出调试信息
    debug:true,
    cert:`${cert_path}/api.dwx.asia.pem`,
    key:`${cert_path}/api.dwx.asia.key`
})

// 添加路由
app.get('/',async c=>{
    c.send('OK')
})
/**-------------content路由------------ */
//获取内容列表
app.get('/content',async c =>{
    let ret = await psql.query(`select * from content`)
    //等于c.res.body = ret.rows
    c.send(ret.rows);
})
//获取具体内容
app.get('/content/:id',async c =>{
    let sqltext = `SELECT * FROM content WHERE id=$1`
    let r = await psql.query(sqltext,[c.param.id])
    if(r.rowCount === 0){
        return c.status(404).send('content not found')
    }
    c.send(r.rows[0]);
})
//创建内容
app.post('/content',async c =>{
    try{
        //提交的body数据通过c.body获取
        let data = JSON.parse(c.body)
        let sqltext = `INSERT INTO`+`content(id,add_time,detail,title,updata_time)`+
        `VALUES ($1,$2,$3,$4,$5)`
        //生成唯一id
        let id = c.helper.makeID()
        let tm = Date.now()
        let r = await psql.query(sqltext,[
            id,tm,data.detail,data.title,tm
        ])
        if(r.rowCount === 0){
            return c.status(500).send('failed')
        }
        c.send(id)
    }catch(err){
        c.status(400).send('it is not json data')
    }
})
/**-------------content路由 - END ---------- */
app.get('/upload',async c=>{
    // c.reply是响应对象，可写的流，
    // 在HTTP/1.1中指向response，在HTTP/2中指向http2stream
    await c.helper.pipe('./upload.html',c.reply)
})

app.post('/upload',async c=>{
    // 根据name值获取文件对象
    let f = c.getFile('image')
    // 根据传入的原始文件名生成唯一的文件名，主要使用f.filename的扩展名

    if(!f){
        return c.status(400).send('image not found')
    }

    let fname = c.helper.makeName(f.filename)

    // 移动文件到指定位置
    await c.moveFile(f,'./images/${fname}')

    c.send(fname)
})

//*表示任意路径
//用于处理静态资源
// app.get('/static/*',async c=>{

// })

// 添加获取图片返回数据的路由
// ：表示路由是动态变化的，可以是不同的，用于识别不同的参数
// name是路由参数的名字
app.get('/image/:name', async c =>{
    // c.param是一个对象，其中的key值是路由参数的名称
    let imgname = c.param.name
    // 将文件路径和协议接连
    await c.helper.pipe(`./images/${imgname}`,c.reply)
})

let tok = token({
    //token有效期，单位为秒
    expires:45,
    //必须是32位字符
    key:'1dwfelgfiwufhomdsfksfsmfsdmf8y6r',
    //必须是16位字符
    iv:'37rt78otg8yfelkg'
})

app.get('/mp-login/:code',async c=>{
    let auth_url = `https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code`
                    +`?appid=${wxkey.appid}`
                    +`&secret=${wxkey.secret}`
                    +`&js_code=${c.param.code}`
                    +`&grant_type=authorization_code`
    
    let ret = await httpcli.get(auth_url)
                            .then(res=>{
                                return res.json()
                            })
    c.send(tok.make(ret))
})

app.get('/decrypt/:token',async c =>{
    c.send(tok.verify(c.param.token))
})
// 运行在1234端口
app.run(1234)